# -*- coding: utf-8 -*-

# 使用生成式，可能会存在一个严重的问题， 当要求生成的数据非常多的时候， 可能会导致内存爆掉，这个时候
# 我们就需要使用生成器，这个与生成式的区别在于它不是一次性生成所有元素， 而是每调用一次生成一个元素
# 如下：第一个是生成式， 第二个是生成器

# 两者看上去没有什么太大的区别， 就是将[] 改成了(), 但是生成器是通过调用next()方法生成元素， 而
# 生成式则是一次性生成所有的元素
compre = [n * n for n in range(1, 4)]
print compre

gener = (n * n for n in range(1, 4))
print gener.next()

# 以上是一种生成器的定义方式，还有一中类似方法定义，如下，第一中是定义方法， 第二种则是定义生成器
# 可以看到两者的区别就在于方法的print被调整为了yield

def nn(n):
    i = 1
    while i < n:
        print i * i
        i += 1
print nn(3)

def ngn(n):
    i = 1
    while i < n:
        yield i * i
        i += 1

var = ngn(10)

print var.next()